package com.example.kotlindemo.demo

import java.util.*

/**
 * Author 87231
 * 2022/8/30 22:39
 *
 * Unit11
 * describe：枚举最常见的用法是实现一个类型安全的枚举
 * 枚举量常用逗号分隔，没有枚举常量都是一个对象
 * enum class Color{
 *RED,BLACK,BLUE,GREEN,WHITE
 * }
 *
 **/
class Unit11 {
    /**
     * 一、枚举初始化：
     */
//    每一个枚举都是枚举类的实例，他们可以被初始化
    enum class Colors(var value: String) {
        RED("111"),
        BLUE("222"),
        GREEN("333")
    }

    //    默认名称为枚举字符名，值从0开始。若需要指定值，则可以使用其构造函数。
    enum class Shape( value: Double) {
        price(value = 123.2),
        height(value = 12.2)
    }
//    枚举还支持一声明自己匿名类及相应的方法、以及覆盖基类方法。
    enum class ProtocolState{
    ALERTED{
        override fun show(): ProtocolState {
            print("ALERTED")
            return ALERTED
        }
    }, //定义的任何成员需要使用逗号分开
    CONNECTING{
        override fun show(): ProtocolState {
            print("CONNECTING")
            return CONNECTING
        }
    };
    abstract fun show():ProtocolState
    }
    /**
     * 使用枚举常量
     */
    fun test(){
        var valueOf = Shape.valueOf("price")//转换为指定的枚举值
        println(valueOf)
        var arrayOfShapes = Shape.values()//以数组形式返回枚举值
        for (arrayOfShape in arrayOfShapes) {
            println(arrayOfShape)
        }
    }
// 自 Kotlin 1.1 起，可以使用 enumValues<T>() 和 enumValueOf<T>()
// 函数以泛型的方式访问枚举类中的常量
enum class RGB { RED, GREEN, BLUE }

    inline fun <reified T : Enum<T>> printAllValues() {
        print(enumValues<T>().joinToString { it.name })
    }
 fun foo(){
     printAllValues<RGB>() // 输出 RED, GREEN, BLUE
 }
}